/*
 * This software code is (c) 2010 T-Mobile USA, Inc. All Rights Reserved.
 *
 * Unauthorized redistribution or further use of this material is
 * prohibited without the express permission of T-Mobile USA, Inc. and
 * will be prosecuted to the fullest extent of the law.
 *
 * Removal or modification of these Terms and Conditions from the source
 * or binary code of this software is prohibited.  In the event that
 * redistribution of the source or binary code for this software is
 * approved by T-Mobile USA, Inc., these Terms and Conditions and the
 * above copyright notice must be reproduced in their entirety and in all
 * circumstances.
 *
 * No name or trademarks of T-Mobile USA, Inc., or of its parent company,
 * Deutsche Telekom AG or any Deutsche Telekom or T-Mobile entity, may be
 * used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" AND "WITH ALL FAULTS" BASIS
 * AND WITHOUT WARRANTIES OF ANY KIND.  ALL EXPRESS OR IMPLIED
 * CONDITIONS, REPRESENTATIONS OR WARRANTIES, INCLUDING ANY IMPLIED
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
 * NON-INFRINGEMENT CONCERNING THIS SOFTWARE, ITS SOURCE OR BINARY CODE
 * OR ANY DERIVATIVES THEREOF ARE HEREBY EXCLUDED.  T-MOBILE USA, INC.
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE
 * OR ITS DERIVATIVES.  IN NO EVENT WILL T-MOBILE USA, INC. OR ITS
 * LICENSORS BE LIABLE FOR LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
 * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT
 * OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF T-MOBILE USA,
 * INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * THESE TERMS AND CONDITIONS APPLY SOLELY AND EXCLUSIVELY TO THE USE,
 * MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE, ITS SOURCE OR BINARY
 * CODE OR ANY DERIVATIVES THEREOF, AND ARE SEPARATE FROM ANY WRITTEN
 * WARRANTY THAT MAY BE PROVIDED WITH A DEVICE YOU PURCHASE FROM T-MOBILE
 * USA, INC., AND TO THE EXTENT PERMITTED BY LAW.
 */

package javax.microedition.ims.core;

import javax.microedition.ims.common.IMSMessage;
import javax.microedition.ims.common.MessageType;
import javax.microedition.ims.core.dispatcher.Filter;
import javax.microedition.ims.messages.wrappers.msrp.MsrpMessage;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * User: Pavel Laboda (pavel.laboda@gmail.com)
 * Date: 24-Feb-2010
 * Time: 15:39:33
 */
public class MessageFilterMsrp implements Filter<MsrpMessage> {

    private final IMSEntity entity;
    private final Map<MessageType, Class<? extends IMSMessage>> applicableMessages;
    private final String transactionId;

    public MessageFilterMsrp(
            final IMSEntity entity,
            final Map<MessageType, Class<? extends IMSMessage>> applicableMessages, String transactionId) {

        this.entity = entity;
        this.transactionId = transactionId;

        final Map<MessageType, Class<? extends IMSMessage>> msgMap =
                applicableMessages == null || applicableMessages.size() == 0 ?
                        createDefaultMessageMap() :
                        applicableMessages;

        this.applicableMessages = Collections.unmodifiableMap(new HashMap<MessageType, Class<? extends IMSMessage>>(msgMap));
    }

    private Map<MessageType, Class<? extends IMSMessage>> createDefaultMessageMap() {
        final Map<MessageType, Class<? extends IMSMessage>> msgMap;
        final MessageType[] messageTypes = MessageType.values();
        msgMap = new HashMap<MessageType, Class<? extends IMSMessage>>(messageTypes.length);

        for (MessageType messageType : messageTypes) {
            msgMap.put(messageType, MsrpMessage.class);
        }
        return msgMap;
    }

    public boolean isApplicable(final MsrpMessage msg) {
        MessageType messageType = MessageType.parse(msg.getType().name());

        boolean retValue = applicableMessages.containsKey(messageType) &&
                applicableMessages.get(messageType).isAssignableFrom(msg.getClass());
        retValue = transactionId.equalsIgnoreCase(msg.getTransactionId());
        return retValue;
    }

    public void update(MsrpMessage msg) {
        //To change body of implemented methods use File | Settings | File Templates.
    }


    public String toString() {
        final StringBuffer sb = new StringBuffer();
        sb.append("MessageFilterMsrp");
        sb.append("{entity=").append(entity);
        sb.append(", applicableMessages=").append(applicableMessages);
        sb.append('}');
        return sb.toString();
    }
}
